import { CallHandler, ExecutionContext, Injectable, NestInterceptor, RequestTimeoutException } from '@nestjs/common';
import { Observable, TimeoutError, catchError, throwError, timeout } from 'rxjs';

@Injectable()
export class TimeoutInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {

    //handle()函数是异步的。在 NestJS 中，拦截器和中间件都是基于 RxJS 的Observable实现的
    return next.handle().pipe(

      //timeout 操作符会在 3s 没收到消息的时候抛一个 TimeoutError。
      timeout(3000),

      catchError(err=>{
        if(err instanceof TimeoutError){
          console.log(err);
          //抛出 HttpException 里的 RequestTimeoutException(超时异常)
          return throwError(() => new RequestTimeoutException() );  
        }
        //其他异常
        return throwError(() => err);
      })

    )
  }
}
